package com.jrauto.CarAppBackend.controller;

import com.jrauto.CarAppBackend.service.CosService;
import com.jrauto.CarAppBackend.service.StsService;
import com.qcloud.cos.model.COSObjectSummary;
import com.tencent.cloud.Response;
import jakarta.annotation.Resource;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author : huiMing
 * Date : 2025年07月02日 16:14
 * @version V1.0
 */
@RestController
@RequestMapping("/cos") // Dedicated path for direct COS image operations
@CrossOrigin(origins = "*") // 允许所有源进行跨域请求，实际项目中请限制为你的前端域名
public class CosImageController {

    @Resource
    private CosService cosService;

    @Resource
    private StsService stsService;

    /**
     * 上传单张图片到腾讯云COS。
     *
     * @param file 要上传的图片文件。
     * @return 包含上传结果的响应。
     */
    @PostMapping("/upload")
    public ResponseEntity<Map<String, String>> uploadImage(@RequestParam("file") MultipartFile file) {
        Map<String, String> response = new HashMap<>();
        if (file.isEmpty()) {
            response.put("message", "上传文件不能为空。");
            return ResponseEntity.badRequest().body(response);
        }

        try {
            String fileUrl = cosService.uploadFile(file);
            response.put("message", "图片上传成功！");
            response.put("url", fileUrl);
            return ResponseEntity.status(HttpStatus.CREATED).body(response);
        } catch (IllegalArgumentException e) {
            response.put("message", "上传失败: " + e.getMessage());
            return ResponseEntity.badRequest().body(response);
        } catch (RuntimeException e) {
            response.put("message", "COS服务异常或客户端错误: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
        } catch (IOException e) {
            response.put("message", "文件I/O错误: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
        }
    }

    /**
     * 批量上传多张图片到腾讯云COS。
     *
     * @param files 要上传的图片文件数组。
     * @return 只包含每张图片url的数组。
     */
    @PostMapping("/upload/batch")
    public ResponseEntity<List<String>> uploadImages(@RequestParam("files") MultipartFile[] files) {
        if (files == null || files.length == 0) {
            return ResponseEntity.badRequest().body(List.of());
        }
        List<String> urls = new java.util.ArrayList<>();
        for (MultipartFile file : files) {
            if (!file.isEmpty()) {
                try {
                    String fileUrl = cosService.uploadFile(file);
                    urls.add(fileUrl);
                } catch (Exception e) {
                    // 跳过上传失败的图片，不加入urls
                }
            }
        }
        return ResponseEntity.status(HttpStatus.CREATED).body(urls);
    }

    /**
     * 根据图片URL从腾讯云COS删除图片。
     *
     * @param imageUrl 要删除图片的完整COS URL。
     * @return 删除结果。
     */
    @DeleteMapping("/delete")
    public ResponseEntity<Map<String, String>> deleteImage(@RequestParam("imageUrl") String imageUrl) {
        Map<String, String> response = new HashMap<>();
        if (imageUrl == null || imageUrl.isEmpty()) {
            response.put("message", "图片URL不能为空。");
            return ResponseEntity.badRequest().body(response);
        }

        try {
            boolean deleted = cosService.deleteFile(imageUrl);
            if (deleted) {
                response.put("message", "图片删除成功！");
                return ResponseEntity.ok(response);
            } else {
                response.put("message", "图片删除失败，可能是URL无效或文件不存在。");
                return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response); // Or 404 NOT_FOUND if file wasn't found
            }
        } catch (RuntimeException e) {
            response.put("message", "COS服务异常或客户端错误: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
        }
    }

    /**
     * 列出指定COS文件夹下的所有图片。
     *
     * @param prefix 可选参数，指定要列出的文件夹前缀，例如 "/cars/"。
     * @return 包含图片列表及元数据。
     */
    @GetMapping("/list")
    public ResponseEntity<List<Map<String, String>>> listImages(@RequestParam(value = "prefix", required = false) String prefix) {
        try {
            List<COSObjectSummary> objectSummaries = cosService.listObjects(prefix);

            // 将COSObjectSummary对象转换为更简单的Map列表返回给前端
            List<Map<String, String>> imageList = objectSummaries.stream()
                    .map(summary -> {
                        Map<String, String> imageInfo = new HashMap<>();
                        imageInfo.put("key", summary.getKey());
                        imageInfo.put("size", String.valueOf(summary.getSize()));
                        imageInfo.put("lastModified", summary.getLastModified().toString());
                        imageInfo.put("eTag", summary.getETag());
                        // 如果需要完整URL，可以在这里拼接
                        // imageInfo.put("url", yourCosWebUrl + summary.getKey()); // 需要注入yourCosWebUrl
                        return imageInfo;
                    })
                    .collect(Collectors.toList());

            return ResponseEntity.ok(imageList);
        } catch (RuntimeException e) {
            Map<String, String> errorResponse = new HashMap<>();
            errorResponse.put("message", "列出图片失败: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null); // Or return errorResponse directly if you modify method signature
        }
    }

    /**
     * 生成图片的预签名URL，用于临时访问。
     *
     * @param cosKey COS上的对象Key（例如：/cars/your_image.jpg）。
     * @param expirationMinutes 预签名URL的有效期（分钟），默认60分钟。
     * @return 预签名URL。
     */
    @GetMapping("/presigned-url")
    public ResponseEntity<Map<String, String>> generatePresignedUrl(
            @RequestParam("cosKey") String cosKey,
            @RequestParam(value = "expirationMinutes", defaultValue = "60") int expirationMinutes) {
        Map<String, String> response = new HashMap<>();
        if (cosKey == null || cosKey.isEmpty()) {
            response.put("message", "COS Key不能为空。");
            return ResponseEntity.badRequest().body(response);
        }

        try {
            String presignedUrl = cosService.generatePresignedUrl(cosKey, expirationMinutes);
            response.put("message", "预签名URL生成成功。");
            response.put("presignedUrl", presignedUrl);
            return ResponseEntity.ok(response);
        } catch (RuntimeException e) {
            response.put("message", "生成预签名URL失败: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
        }
    }

    @GetMapping("/getTempCredentials")
    public Map<String, Object> getTempCredentials() {
        Map<String, Object> result = new HashMap<>();
        try {
            Response response = stsService.getTempCredentials();
            result.put("code", 0);
            result.put("message", "Success");
            Map<String, String> credentials = new HashMap<>();
            credentials.put("tmpSecretId", response.credentials.tmpSecretId);
            credentials.put("tmpSecretKey", response.credentials.tmpSecretKey);
            credentials.put("sessionToken", response.credentials.sessionToken);
            credentials.put("startTime", String.valueOf(response.startTime));
            credentials.put("expiredTime", String.valueOf(response.expiredTime));
            result.put("data", credentials);
        } catch (RuntimeException e) {
            result.put("code", -1);
            result.put("message", e.getMessage());
        }
        return result;
    }

    // 注意：COS没有直接的“更新图片”API，更新通常意味着删除旧文件并上传新文件。
    // 如果需要实现更新，前端通常会先删除旧图片并上传新图片，然后将新图片URL传递给业务逻辑。
    // 或者您可以在CosService中封装一个 updateFile(oldFileUrl, newFile) 方法。
}